import pygame
import random
from game_items import *
from game_hud import *
from game_music import *
class Game(object):
    """游戏类"""
    def __init__(self):

        self.main_window = pygame.display.set_mode(SCREEN_RECT.size)
        pygame.display.set_caption("飞机大战")

        self.is_game_over = False
        self.is_pause = False
        self.all_group = pygame.sprite.Group()
        self.enemies_group = pygame.sprite.Group()
        self.supplies_group = pygame.sprite.Group()
        self.all_group.add(Background(False), Background(True))
        self.hud_panel = HUDPanel(self.all_group)
        self.create_enemies()
        self.hero = Hero(self.all_group)
        self.hud_panel.show_bomb(self.hero.bomb_count)
        self.create_supplies()
        self.player = MusicPlayer("game_music.ogg")
        self.player.play_music()
        # 背景精灵，向下方移动
        # GameSprite("background.png", 1, self.all_group)
        # 英雄精灵，静止不动
        # self.hero = Plane(1000, 5, 0, "me_down_wav",
        #                  ["me%d.png" % i for i in range(1, 3)],
        #                  "me1.png", ["me_destroy_%d.png" % i for i in range(1, 5)],
        #                 self.all_group)
        # self.hero.rect.center = SCREEN_RECT.center
        # TODO：将所有敌机的速度设置为0，并修改敌机的初始位置
        # for enemy in self.enemies_group.sprites():
        #    enemy.speed = 0
        #    enemy.rect.y += 400
        # self.hero.speed = 1

    def reset_game(self):
        """重置游戏 """
        self.is_game_over = False
        self.is_pause = False
        self.hud_panel.reset_panel()
        self.hero.rect.midbottom = HERO_DEFAULT_MID_BOTTOM
        for enemy in self.enemies_group:
            enemy.kill()
        for bullet in self.hero.bullets_group:
            bullet.kill()
        self.create_enemies()

    def event_handler(self):
        """事件监听
        :return:如果签听到退出事件返回true否则返回false
        """
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                return True
            elif event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
                return True
            elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
                if self.is_game_over:
                    self.reset_game()
                else:
                    self.is_pause = not self.is_pause
                    self.player.pause_music(self.is_pause)
            if not self.is_game_over and not self.is_pause:
                if event.type == BULLET_ENHANCED_OFF_EVENT:
                    self.hero.bullets_kind = 0
                if event.type == THROW_SUPPLY_EVENT:
                    supply = random.choice(self.supplies_group.sprites())
                    supply.throw_supply()
                if event.type == HERO_FIRE_EVENT:
                    self.player.play_sound("bullet.wav")
                    self.hero.fire(self.all_group)
                if event.type == HERO_POWER_OFF_EVENT:
                    print("取消无敌状态...")
                    self.hero.is_power = False
                    pygame.time.set_timer(HERO_POWER_OFF_EVENT, 0)
                if event.type == HERO_DEAD_EVENT:
                    print("英雄牺牲了...")
                    self.hud_panel.lives_count -= 1
                    self.hud_panel.show_lives()
                    self.hud_panel.show_bomb(self.hero.bomb_count)
                if event.type == pygame.KEYDOWN and event.key == pygame.K_b:
                    if self.hero.hp > 0 and self.hero.bomb_count > 0:
                        self.player.play_sound("use_bomb.wav")
                    score = self.hero.blowup(self.enemies_group)
                    # 更新炸弹数量显示
                    self.hud_panel.show_bomb(self.hero.bomb_count)
                    if self.hud_panel.increase_score(score):
                        self.create_enemies()
                    # TODO测试炸毁所有敌机
                    # for enemy in self.enemies_group.sprites():
                    #    enemy.hp = 0
                    # TODO测试炸弹数量变化（#TODO表示待完成项目提醒）
                    # self.hud_panel.show_bomb(random.randint(0, 100))
                    # TODO测试生命计数数量变化
                    # self.hud_panel.lives_count = random.randint(0, 10)
                    # self.hud_panel.show_lives()
        return False

    def create_supplies(self):
        """创建道具"""
        Supply(0, self.supplies_group, self.all_group)
        Supply(1, self.supplies_group, self.all_group)

        pygame.time.set_timer(THROW_SUPPLY_EVENT, 10000)

    def create_enemies(self):
        """根据游戏级别创建不同数量的敌机"""
        count = len(self.enemies_group.sprites())
        groups = (self.all_group, self.enemies_group)
        if self.hud_panel.level == 1 and count == 0:
            for i in range(16):
                Enemy(0, 3, *groups)
        elif self.hud_panel.level == 2 and count == 16:
            for enemy in self.enemies_group.sprites():
                enemy.max_speed = 5
            for i in range(8):
                Enemy(0, 5, *groups)
            for i in range(2):
                Enemy(1, 1, *groups)
        elif self.hud_panel.level == 3 and count == 26:
            for enemy in self.enemies_group.sprites():
                enemy.max_speed = 7 if enemy.kind == 0 else 3
            for i in range(8):
                Enemy(0, 7, *groups)
            for i in range(2):
                Enemy(1, 3, *groups)
            for i in range(2):
                Enemy(2, 1, *groups)

    def check_collide(self):
        """碰撞检测"""
        if not self.hero.is_power:
            enemies = pygame.sprite.spritecollide(self.hero,
                                                  self.enemies_group, False,
                                                  pygame.sprite.collide_mask)
            enemies = list(filter(lambda x: x.hp > 0, enemies))
            if enemies:
                self.player.play_sound(self.hero.wav_name)
                self.hero.hp = 0
            for enemy in enemies:
                enemy.hp = 0

            hit_enemies = pygame.sprite.groupcollide(self.enemies_group,
                                                    self.hero.bullets_group,
                                                    False,
                                                    False,
                                                    pygame.sprite.collide_mask)
            for enemy in hit_enemies:
                    if enemy.hp <= 0:
                        continue
                    for bullet in hit_enemies[enemy]:
                        bullet.kill()
                        enemy.hp -= bullet.damage
                        if enemy.hp > 0:
                            continue
                        if self.hud_panel.increase_score(enemy.value):
                            self.player.play_sound("upgrade.wav")
                            self.create_enemies()
                        self.player.play_sound(enemy.wav_name)
                        break

            supplies = pygame.sprite.spritecollide(self.hero,
                                                   self.supplies_group,
                                                   False,
                                                   pygame.sprite.collide_mask)
            if supplies:
                supply = supplies[0]

                self.player.play_sound(supply.wav_name)

                supply.rect.y = SCREEN_RECT.h

                if supply.kind == 0:
                    self.hero.bomb_count += 1
                    self.hud_panel.show_bomb(self.hero.bomb_count)
                else:
                    self.hero.bullets_kind = 1

                    pygame.time.set_timer(BULLET_ENHANCED_OFF_EVENT, 8000)

    def start(self):
            """开始游戏"""
            clock = pygame.time.Clock()
            frame_counter = 0
            while True:

                self.is_game_over = self.hud_panel.lives_count == 0
                if self.event_handler():
                    self.hud_panel.save_best_score()
                    return
                if self.is_game_over:
                    self.hud_panel.panel_pause(True, self.all_group)
                elif self.is_pause:
                    self.hud_panel.panel_pause(False, self.all_group)
                else:
                    self.hud_panel.panel_resume(self.all_group)
                    self.check_collide()

                    keys = pygame.key.get_pressed()

                    if keys[pygame.K_RIGHT]:
                        self.hero.rect.x += 10

                    move_hor = keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]

                    move_ver = keys[pygame.K_DOWN] - keys[pygame.K_UP]

                    frame_counter = (frame_counter + 1) % FRAME_INTERVAL

                    self.all_group.update(frame_counter == 0, move_hor, move_ver)
                    # 测试修改游戏得分
                    # if self.hud_panel.increase_score(100):
                    #    print("升级到 %d" % self.hud_panel.level)
                    #    self.create_enemies()
                    # 更新 all_group 中所有精灵内容
                    # self.all_group.update()
                # 绘制 all_group 中的所有精灵
                self.all_group.draw(self.main_window)
                pygame.display.update()
                clock.tick(60)

if __name__ == '__main__':
    pygame.init()
    Game().start()
    pygame.quit()